﻿#region Using

using System;
using Commons.Diagnostics;
using SAPbouiCOM;
using SapFramework.Application;
using SapFramework.Interface.Events;


#endregion

namespace SapFramework.Interface.Controls.Menus.Base
{
    /// <summary>
    /// Implementa uma classe wrapper para um objeto de Menu do SAP Business One.
    /// </summary>
    public abstract class Menu : SAPbouiCOM.MenuItem
    {
        #region Eventos

        /// <summary>
        /// Evento disparado quando o botão principal do mouse for pressionado sobre um item de menu, mas nenhuma ação foi tomada ainda pelo SAP Business One.
        /// </summary>
        [Event( BoEventTypes.et_MENU_CLICK )]
        public event EventBoolMenu OnBeforeClick;

        /// <summary>
        /// Evento disparado quando o botão principal do mouse for pressionado sobre um item de menu, e qualquer ação do SAP Business One já foi tomada.
        /// </summary>
        [Event( BoEventTypes.et_MENU_CLICK )]
        public event EventVoidMenu OnAfterClick;

        #endregion

        public AddOn AddOn { get; private set; }

        private readonly SAPbouiCOM.MenuItem mMenuItem;

        /// <summary>
        /// Construtor padrão.
        /// </summary>
        /// <param name="aAddOn">AddOn ao qual pertence este menu.</param>
        /// <param name="aMenuUniqueId">Código único deste menu.</param>
        public Menu( AddOn aAddOn, string aMenuUniqueId )
        {
            Contract.Requires.NotNull( () => aAddOn );
            Contract.Requires.NotNull( () => aAddOn.Connection );
            Contract.Requires.NotNull( () => aAddOn.Connection.Interface );

            AddOn = aAddOn;

            mMenuItem = AddOn.Connection.Interface.Menus.Item( aMenuUniqueId );
        }

        #region SAPbouiCOM.MenuItem Members

        /// <summary>
        /// Simula um click do usuário sobre o menu.
        /// </summary>
        /// <remarks>
        /// Para uma melhor performance, é recomendado utilizar <see cref="IApplication.ActivateMenuItem">ActivateMenuItem</see>.
        /// </remarks>
        /// <exception cref="Exception">Quando o menu estiver desabilitado, lança uma exceção ao executar esta ação.</exception>
        public void Activate()
        {            
            mMenuItem.Activate();
        }

        /// <summary>
        /// Retorna uma coleção, contendo os submenus deste menu.
        /// </summary>
        public SAPbouiCOM.Menus SubMenus
        {
            get { return mMenuItem.SubMenus; }
        }

        /// <summary>
        /// O ID único deste menu.
        /// </summary>
        public string UID
        {
            get { return mMenuItem.UID; }
        }

        /// <summary>
        /// O texto apresentado pelo menu.
        /// </summary>
        public string String
        {
            get { return mMenuItem.String; }
            set { mMenuItem.String = value; }
        }

        /// <summary>
        /// O tipo deste menu.
        /// </summary>
        /// <see cref="SAPbouiCOM.BoMenuType"/>
        public BoMenuType Type
        {
            get { return mMenuItem.Type; }
        }

        /// <summary>
        /// Indica quando um item de menu recebe uma marca de checado quando ele for clicado.
        /// </summary>
        public bool Checked
        {
            get { return mMenuItem.Checked; }
            set { mMenuItem.Checked = value; }
        }

        /// <summary>
        /// Indica quando um item de menu está ativo.
        /// </summary>
        /// <exception cref="Exception">Tentar habilitar um item de menu do sistema que esteja desabilitado irá causar uma exceção.</exception>
        public bool Enabled
        {
            get { return mMenuItem.Enabled; }
            set { mMenuItem.Enabled = value; }
        }

        /// <summary>
        /// Caminho para uma imagem que será mostrada a esquerda do item de menu.
        /// </summary>
        /// <remarks>
        /// Formatos de imagem suportados são BMP e JPG.
        /// 
        /// O tamanho das imagens deverá ser (em pixels) de 16x16 para itens na barra de menus e de 26x18 para itens no menu principal.
        /// </remarks>
        public string Image
        {
            get { return mMenuItem.Image; }
            set { mMenuItem.Image = value; }
        }

        #endregion
    }
}